﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data;
using BMG.BLL.Classes;

namespace BMG.WS
{
    public class BMGCatalogue : IBMGCatalogue
    {
        /// <summary>
        /// Méthode renvoyant la liste de toutes les catégories
        /// </summary>
        /// <param name="aWithNoChoice">true si on veut pouvoir ne sélectionner aucune catégorie (présence d'un tiret dans la liste)</param>
        /// <returns>Liste générique de catégories</returns>
        public List<categorie> GetCategorieList(bool aWithNoChoice)
        {
            DataTable dt = CATEGORIE_MANAGER.GetList(aWithNoChoice);
            List<categorie> lc = new List<categorie>();
            categorie nc;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                // Attention, prévoir la gestion d'un type entier null sinon ça plante
                nc = new categorie((int)dt.Rows[i]["id_cat"], dt.Rows[i]["intitule_cat"].ToString(), dt.Rows[i]["description_cat"].ToString(), (dt.Rows[i]["pid_cat"] != DBNull.Value) ? (int)(dt.Rows[i]["pid_cat"]) : 0);
                lc.Add(nc);
            }
            return lc;
        }

        /// <summary>
        /// Méthode renvoyant la liste des produits auxquels correspond la description (ou tous les produits si aucune description)
        /// </summary>
        /// <param name="aDescriptionNom">Texte qui sera recherché dans l'intitulé et dans la description</param>
        /// <returns>Liste générique de produits</returns>
        public List<produit> GetProduitList(String aDescriptionNom)
        {
            DataTable dt = PRODUIT_MANAGER.GetList(aDescriptionNom, null);
            List<produit> lp = new List<produit>();
            produit np;
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    np = new produit((int)dt.Rows[i]["id_pro"], dt.Rows[i]["intitule_pro"].ToString(), dt.Rows[i]["description_pro"].ToString(), (decimal)dt.Rows[i]["prix_pro"], (int)dt.Rows[i]["stockrestant_pro"], (int)(dt.Rows[i]["id_cat"]));
                    lp.Add(np);
                }
            }
            else
            {
                lp.Add(new produit(-1, "Produit inexistant", "Pas de produit correspondant", 0, 0, -1));
            }
            return lp;
        }

        /// <summary>
        /// Méthode renvoyant la liste des produits auxquels correspond la description (ou tous les produits si aucune description) au sein de la catégorie indiquée
        /// </summary>
        /// <param name="aDescriptionNom">Texte qui sera recherché dans l'intitulé et dans la description</param>
        /// <param name="aID_CAT">Identifiant de la catégorie parente dans laquelle effectuer la recherche</param>
        /// <returns>Liste générique de produits</returns>
        public List<produit> GetProduitListDansCategorie(String aDescriptionNom, int aID_CAT)
        {
            DataTable dt = PRODUIT_MANAGER.GetList(aDescriptionNom, aID_CAT);
            List<produit> lp = new List<produit>();
            produit np;
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    np = new produit((int)dt.Rows[i]["id_pro"], dt.Rows[i]["intitule_pro"].ToString(), dt.Rows[i]["description_pro"].ToString(), (decimal)dt.Rows[i]["prix_pro"], (int)dt.Rows[i]["stockrestant_pro"], (int)(dt.Rows[i]["id_cat"]));
                    lp.Add(np);
                }
            }
            else
            { 
                lp.Add(new produit(-1, "Produit inexistant", "Pas de produit correspondant", 0, 0, -1));
            }
            return lp;
        }

        /// <summary>
        /// Méthode renvoyant la liste des produits auxquels correspond la description (ou tous les produits si aucune description) au sein de la catégorie indiquée
        /// </summary>
        /// <param name="aDescriptionNom">Texte qui sera recherché dans l'intitulé et dans la description</param>
        /// <param name="aID_CAT">Identifiant de la catégorie parente dans laquelle effectuer la recherche</param>
        /// <returns>Liste générique de produits</returns>
        public produit GetProduit(int aID_PRO)
        {
            DataRow dr = PRODUIT_MANAGER.Get(aID_PRO);
            produit np = null;
            if (dr != null)
                np = new produit((int)dr["id_pro"], dr["intitule_pro"].ToString(), dr["description_pro"].ToString(), (decimal)dr["prix_pro"], (int)dr["stockrestant_pro"], (int)(dr["id_cat"]));
            else
                np = new produit(-1, "Produit inexistant", "Pas de produit avec cette référence", 0, 0, -1);
            return np;
        }
        
    }
}
